/**
 * 计算环比增长率
 * @param {number} current - 当前值
 * @param {number} last - 上期值
 * @param {object} options - 配置选项
 * @param {number} options.precision - 保留小数位数，默认2位
 * @param {boolean} options.asPercent - 是否返回百分比字符串，默认false
 * @param {'zero'|'keep'|'custom'} options.zeroStrategy - 上期值为0时的处理策略
 *        - 'zero': 返回0
 *        - 'keep': 保持原值
 *        - 'custom': 自定义返回值
 * @param {string|number} options.zeroValue - 当zeroStrategy为custom时的自定义返回值
 * @returns {number|string} 返回环比增长率
 * @throws {Error} 当参数无效时抛出错误
 */
export const calculateCompare = (current, last, options = {}) => {
    // 参数校验
    if (typeof current !== 'number' || typeof last !== 'number') {
        throw new Error('参数必须为数字类型');
    }

    // 解构配置选项，设置默认值
    const {
        precision = 2,
        asPercent = false,
        zeroStrategy = 'zero',  // 默认策略：返回0
        zeroValue = '-- --'     // 自定义返回值的默认值
    } = options;

    // 处理上期值为0的情况
    if (last === 0) {
        switch (zeroStrategy) {
            case 'zero':
                // 策略1：返回0
                return asPercent ? '0%' : 0;

            case 'keep':
                // 策略2：保持原值，当前值即为增长率
                return asPercent ? `${current}%` : current;

            case 'custom':
                // 策略3：返回自定义值
                return zeroValue;

            default:
                throw new Error('无效的zeroStrategy值');
        }
    }

    // 计算环比增长率
    const rate = ((current - last) / Math.abs(last)) * 100;

    // 处理精度
    const result = Number(rate.toFixed(precision));

    // 根据选项返回不同格式
    return asPercent ? `${result}%` : result;
};
